﻿//using System;
//using System.IO;
//using System.Runtime.InteropServices;
//using System.Text;
//using Microsoft.Win32.SafeHandles;

//namespace WindowsAPI.Service
//{
//    class Temp
//    {
//        [StructLayout(LayoutKind.Sequential)]
//        struct WIN32_STREAM_ID
//        {
//            public uint dwStreamId;
//            public uint dwStreamAttributes;
//            public long Size;
//            public uint dwStreamNameSize;
//            public StringBuilder cStreamName;
//        }

//        int _tmain(int argc, string[] argv)
//        {
//            WIN32_STREAM_ID sid;
//            //ZeroMemory(&sid, sizeof(WIN32_STREAM_ID));
//            uint dw1, dw2, dwRead;
//            int numofstreams = 0;
//            //Буфер для имени потока в формате Unicode
//            string wszStreamName;
//            IntPtr lpContext = IntPtr.Zero;
//            /*
//             *        Открываем файл для чтения с параметром
//             *        FILE_FLAG_BACKUP_SEMANTICS, что позволяет нам
//             *        открывать не только файлы, но и каталоги с дисками.
//             */
//            SafeFileHandle hFile = Kernel32.CreateFile(argv[1], FileAccess.Read, FileShare.Read,
//                    IntPtr.Zero, FileMode.Open, eFileAttributes.BackupSemantics, IntPtr.Zero);
//            if(hFile == null)
//            {
//                Console.WriteLine("Error: Could't open file, directory or disk {0}", argv[1]);
//                return 0;
//            }
//            //uint dwStreamHeaderSize = (LPBYTE) & sid.cStreamName -
//            //        (LPBYTE) & sid + sid.dwStreamNameSize;
//            Console.WriteLine("Streams information for {0}", argv[1]);
//            while(Kernel32.BackupRead(hFile, out sid,
//                    dwStreamHeaderSize, &dwRead, FALSE, TRUE,
//                    &lpContext))
//            {   //Если тип потока неверный, значит прерываем цикл
//                if(sid.dwStreamId == BACKUP_INVALID) break;
//                //ZeroMemory(&wszStreamName, sizeof(wszStreamName));
//                //Получаем имя потока
//                if(!Kernel32.BackupRead(hFile, out wszStreamName, sid.dwStreamNameSize,
//                        &dwRead, FALSE, TRUE, &lpContext)) break;
//                if(sid.dwStreamId == BACKUP_DATA ||
//                        sid.dwStreamId == BACKUP_ALTERNATE_DATA)
//                {
//                    numofstreams++;
//                    Console.WriteLine("\n\nStream\t\t#%u", numofstreams);
//                    switch(sid.dwStreamId)
//                    {
//                        case BACKUP_DATA:
//                            Console.WriteLine("\nName:\t\t::$DATA"); break;
//                        case BACKUP_ALTERNATE_DATA:
//                            Console.WriteLine("\nName:\t\t{0}", wszStreamName); break;
//                    }
//                    Console.WriteLine("\nSize:\t\t{0}", sid.Size);
//                }
//                //Перемещаемся к следующему потоку
//                BackupSeek(hFile, sid.Size.LowPart, sid.Size.HighPart,
//                                        &dw1, &dw2, &lpContext);
//                //Очищаем структуру перед следующим проходом цикла
//                //ZeroMemory(&sid, sizeof(sid));
//            }
//            //Очищаем lpContext, содержащий служебную информацию
//            //для работы функции BackupRead
//            BackupRead(hFile, NULL, NULL,
//                    &dwRead, TRUE, FALSE, &lpContext);
//            //Закрываем файл
//            CloseHandle(hFile);
//            return 0;
//        }
//    }
//}

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace WindowsAPI
{
    internal static class TestClass
    {
        [Obfuscation(Feature = "DllExport")]
        public static int Test(int i) { return i + 1; }

        //public static void Main() { Console.Beep(); }

        /// <summary>
        /// Shows the desktop or restores to previous opened windows. This method acts exactly as
        /// clicking Show Desktop icon in the Quick Launch bar.
        /// </summary>
        public static void ToggleDesktop()
        {
            var shellType = Type.GetTypeFromProgID("Shell.Application");
            var shellObject = Activator.CreateInstance(shellType);
            shellType.InvokeMember("ToggleDesktop", BindingFlags.InvokeMethod, null, shellObject, null);
        }
    }
}

namespace WindowsAPI.Service.Temp
{
    public class TestMarshaler : ICustomMarshaler
    {
        public static ICustomMarshaler GetInstance(string pstrCookie) { return new TestMarshaler(pstrCookie); }

        private readonly string f_PstrCookie;

        private TestMarshaler(string PstrCookie)
        {
            f_PstrCookie = PstrCookie;
            throw new NotImplementedException();
        }

        /// <summary>
        /// Возвращает настраиваемую вызываемую оболочку времени выполнения, которая может выполнять маршалинг 
        /// для неуправляемого интерфейса, передаваемого в качестве аргумента. Упаковщик должен вернуть экземпляр 
        /// настраиваемой вызываемой оболочки времени выполнения для данного типа.
        /// </summary>
        /// <param name="pNativeData"></param>
        /// <returns></returns>
        public object MarshalNativeToManaged(IntPtr pNativeData) { throw new NotImplementedException(); }

        /// <summary>
        /// Возвращает настраиваемую вызываемую оболочку COM, которая может выполнять маршалинг 
        /// для неуправляемого интерфейса, передаваемого в качестве аргумента. Упаковщик должен 
        /// вернуть экземпляр настраиваемой вызываемой оболочки COM для данного типа.
        /// </summary>
        /// <param name="ManagedObj"></param>
        /// <returns></returns>
        public IntPtr MarshalManagedToNative(object ManagedObj) { throw new NotImplementedException(); }

        /// <summary>
        /// Предоставляет настраиваемому упаковщику возможность выполнить необходимую очистку оболочки, 
        /// возвращенной методом MarshalManagedToNative.
        /// </summary>
        /// <param name="pNativeData"></param>
        public void CleanUpNativeData(IntPtr pNativeData) { throw new NotImplementedException(); }

        /// <summary>
        /// Предоставляет настраиваемому упаковщику возможность выполнить необходимую очистку оболочки, 
        /// возвращенной методом MarshalManagedToNative.
        /// </summary>
        /// <param name="ManagedObj"></param>
        public void CleanUpManagedData(object ManagedObj) { throw new NotImplementedException(); }

        /// <summary>
        /// Возвращает экземпляр настраиваемого упаковщика. Этот статический метод может или каждый 
        /// раз создавать новый экземпляр настраиваемого упаковщика, или всегда использовать один и 
        /// тот же упаковщик, если настраиваемый упаковщик не сохраняет сведений о состоянии. 
        /// Метод вызывается службой маршалинга для создания маршалера каждый раз, когда параметр 
        /// или поле помечено с помощью UnmanagedType.CustomMarshaler.
        /// </summary>
        /// <returns></returns>
        public int GetNativeDataSize() { throw new NotImplementedException(); }
    }
}
